﻿using System;
using QualityRpt.Service;
using log4net;
using System.Data;

namespace QualityRpt
{
	public class AutoJob
	{
		static ILog logger = LogManager.GetLogger ("AutoJob");

		public AutoJob ()
		{
		}

		/// <summary>
		/// 自动任务策略
		/// 1. 查询四张原始表的最后交易时间[RawTime1,RawTime2,RawTime3,RawTime4];
		/// 2. 如果RawTime1,RawTime2,RawTime3,RawTime4差距在5天以内则认为四张表是完整的;
		/// 3. RawTime1,RawTime2,RawTime3,RawTime4中以最大的时间作为自动任务的截止时间RawTimeMax;
		/// 4. 从任务表中查询最大的数据结束时间TransTimeMax【合并抽取及分析任务即job_type为0的任务】;
		/// 5. 如果RawTimeMax比TransTimeMax大超过一天的话进行6,如果不存在TransTimeMax则从原始表中取出最小的时间
		/// 6. 增加一个自动任务【开始时间为TransTimeMax，结束时间RawTimeMax,job_type为0,User_ID为0的任务】;
		/// </summary>
		public static void Run ()
		{
			try {
				logger.Info("开始执行进行自动任务分析");
				DateTime[] RawTimes = TransNoteService.GetRawMaxTime ();
				DateTime RawTimeMax = RawTimes [0];
				DateTime RawTimeMin = RawTimes [0];
				for (int i = 0; i < RawTimes.Length; i++) {
					if (RawTimes [i] > RawTimeMax) {
						RawTimeMax = RawTimes [i];
					}
					if (RawTimes [i] < RawTimeMin) {
						RawTimeMin = RawTimes [i];
					}
				}
				TimeSpan ts = RawTimeMax - RawTimeMin;
				if (ts.TotalDays > 5) {
					logger.Info ("进行了一次自动任务策略，发现四张原始表的数据可能不全（四张原始表的最后交易时间差距超过五天）");
				} else {
					//logger.Info(RawTimeMax);
					DateTime? TransTimeMax = ServiceInfoService.GetMaxDataEndTime ();
					//logger.Info(TransTimeMax);
					if (TransTimeMax == null) {//没有job_type=0任务
						TransTimeMax = TransNoteService.GetRawMinTime ();
					}
					logger.Info(TransTimeMax);
					ts = RawTimeMax - TransTimeMax.Value;
					if(ts.TotalDays > 1){
						RawTimeMax = RawTimeMax.AddDays(1);//任务的截至日期不包含当天，所有往后面加一天
						//增加一个自动任务
						DataRow autoJobRow = ServiceInfoService.GetSchema ().NewRow ();
						autoJobRow ["JOB_NAME"] = "自动抽取合并分析任务[" + TransTimeMax.Value.ToString ("yyyyMMdd") + "-"
						+ RawTimeMax.ToString ("yyyyMMdd") + "]";
						autoJobRow ["JOB_TYPE"] = 0;//抽取合并分析任务
						autoJobRow ["JOB_START_TIME"] = DateTime.Now.AddMinutes (10);//10分钟后执行任务
						autoJobRow ["DATA_START_TIME"] = TransTimeMax.Value;
						autoJobRow ["DATA_END_TIME"] = new DateTime(RawTimeMax.Year,RawTimeMax.Month,RawTimeMax.Day);
						autoJobRow ["CREATE_TIME"] = DateTime.Now;
						autoJobRow ["DATA_STATUS"] = 0;
						autoJobRow ["USER_ID"] = 0;//自动策略添加的任务 用户id=0
						DataRow row = ServiceInfoService.Save (autoJobRow);
						logger.Info ("增加了一个自动抽取合并分析任务" + row ["ID"].ToString ());
					}else{
						//logger.Info ("进行了一次自动任务策略，导入数据比任务中最后的数据截至时间不超过一天");
					}
				}
			} catch (Exception ex) {
				logger.Error (ex);
			}
		}
	}
}

